package com.hbpu.usercenter.service;

import com.hbpu.usercenter.dto.UserDTO;
import com.hbpu.usercenter.pojo.User;
import com.hbpu.usercenter.vo.LoginUserVO;
import com.hbpu.usercenter.vo.UserLoginOutVO;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;

import java.util.List;

/**
 * @author 马可
 * @description 针对表【user(用户表)】的数据库操作Service
 * @createDate 2025-06-05 11:45:15
 */
public interface UserService extends IService<User> {

    long registerUser(String userAccount, String userPassword, String checkPassword);

    LoginUserVO loginUser(String userAccount, String userPassword, HttpServletRequest request);

    //用户信息脱敏，不想传输的数据直接不赋值
    <T> UserDTO getProcessedUser(T selectUser);

    /**
     * 用户注销
     * @param request 用户请求
     * @return 注销成功返回UserLoginOutResponse对象
     */
    UserLoginOutVO loginOut(HttpServletRequest request);

    /**
     * 根据用户名查找用户，模糊查询
     *
     * @param username 用户名
     * @return 查询到返回User类型的List集合，否则返回null
     */
    List<UserDTO> selectUsersByUsername(String username);

    /**
     * 查询所有用户
     *
     * @return 返回用户的List集合
     */
    List<UserDTO> selectAllUsers();

    /**
     * 根据用户id删除用户
     *
     * @param id      用户id
     * @return 删除成功返回true，否则返回false
     */
    Boolean deleteUserById(long id);

    /**
     * 获取当前登录用户
     *
     * @param request 用户请求
     * @return 返回脱敏的登录对象
     */
    UserDTO getCurrentUser(HttpServletRequest request);

    /**
     * 判断是否为管理员权限
     *
     * @param request 用户请求
     * @return 是管理员返回true，否则返回false
     */
    boolean isAdmin(HttpServletRequest request);

    /**
     * 判断用户是否登录
     * @param request 用户请求
     * @return 登录返回true 否则返回false
     */
    boolean isLogin(HttpServletRequest request);

    /**
     * 使用数据库通过标签查询
     *
     * @param tagNames 标签
     * @return 查询到的用户对象
     */
    List<UserDTO> selectByTags(List<String> tagNames);

    /**
     * 使用内存通过标签查询
     *
     * @param tagNames 标签
     * @return 查询到的用户对象
     */
    List<UserDTO> searchByTags(List<String> tagNames);

    /**
     * 修改用户信息
     * @param user 修改用户信息的包装类
     * @param request 用户请求
     * @return 受影响的行数
     */
    int updateUser(User user, HttpServletRequest request);

    /**
     * 根据用户标签来推荐用户
     * @param request 用户请求
     * @return 标签相近的用户的列表
     */
//    List<User> recommendUsers(HttpServletRequest request);

    List<UserDTO> recommendUsers(long current, long size, HttpServletRequest request);
}